android 获取视频某一时间的帧,并获取bitmap

您所在的位置:网站首页 安卓 视频截取 android 获取视频某一时间的帧,并获取bitmap

android 获取视频某一时间的帧,并获取bitmap

2023-08-12 21:37| 来源: 网络整理| 查看: 265

最近要做一个为视频设置封面的功能,这里展示一下简单的demo。

demo效果

这里直接将选取的视频某一时间的bitmap显示在视频下方。上面是视频,下面是所获取那一帧的截图。

具体代码

这里的话主要是靠videoView来显示视频内容,seekBar来控制视频的进度,使用MediaMetadataRetriever来获取所选中进度的时间的视频画面。

布局代码 具体代码 public class UploadActivity extends ActivitySupport { @BindView(R.id.vv_player) VideoView videoView; @BindView(R.id.sb_select) SeekBar sbVideo; @BindView(R.id.iv_head) ImageView ivHead; boolean isTouch = false; int totalTime; int currentTime; @Override protected int getLayoutResId() { return R.layout.activity_upload; } @Override protected void initData() { String mp4Path = Environment.getExternalStorageDirectory().getPath() + "/qwwz.mp4"; MediaMetadataRetriever mmr = new MediaMetadataRetriever(); mmr.setDataSource(mp4Path); videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { @Override public void onPrepared(MediaPlayer mp) { totalTime = videoView.getDuration();//毫秒 } }); sbVideo.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { if(isTouch){ currentTime = (int)(((float) progress / 100) * totalTime); videoView.seekTo(currentTime); } } @Override public void onStartTrackingTouch(SeekBar seekBar) { isTouch = true; } @Override public void onStopTrackingTouch(SeekBar seekBar) { isTouch = false; //获取第一帧图像的bitmap对象 单位是微秒 Bitmap bitmap = mmr.getFrameAtTime((long) (currentTime * 1000), OPTION_PREVIOUS_SYNC); ivHead.setImageBitmap(bitmap); } }); videoView.setVideoPath(mp4Path); }

}

问题

很简单,这样就完成了gif所展示的内容。 但是也有明显不足之处:seekBar的progress范围是0 - 100也就是视频获取截图的最小时间单位是视频总时间长度 / 100,这样的单位是满足不了长视频的截图要求的,这里还需要优化,可以通过一个自定义view来实现。

Demo地址:https://github.com/JavaNoober/VideoScreen



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3